// 权限拦截 导航守卫 路由守卫  router
import router from '@/router' // 引入路由实例
import store from '@/store' // 引入vuex store实例
import NProgress from 'nprogress' // 引入一份进度条插件
import 'nprogress/nprogress.css' // 引入进度条样式
// 白名单
const whiteList = ['/login', '/404']
    // 全局前置守卫
router.beforeEach(async(to, from, next) => {
        NProgress.start() //开启进度条
            // 有token
        if (store.getters.token) {
            // 免密登录 有token并且想登录 直接调到主页
            if (to.path === 'login') {

                next('/')
            } else {
                // 如果有token紧跟着就获取信息啦 因为跳转主页
                //会执行这段代码
                // 有token放行
                // 获取用户信息 没有用户信息 则进行用户数据的获取
                if (!store.state.user.UserInfo.userId) {
                    // 命名空间开启啦所以要加模块名 
                    // async 函数 所 return返回的内容 用await 可得到
                    const { roles } = await store.dispatch('user/getUserInfov')
                        // console.log(roles.menus);
                        // 筛选用户可用路由
                    const routes = await store.dispatch('permission/filterRoutes', roles.menus)
                        // addRoutes 把动态路由添加到路由表中

                    router.addRoutes([...routes, { path: '*', redirect: '/404', hidden: true }])
                    next(to.path) //强制的跳转一个地址 next(地址)
                } else {
                    next()
                }
                // 为什么要写await 因为我们想获取完资料再去放行

            }

        } else {
            // 无token 在白名单 放行
            if (whiteList.indexOf(to.path) > -1) {
                next()
            } else {
                // 跳转到登录页
                next('/login')
            }

        }
        NProgress.done() // 手动强制关闭一次  为了解决 手动切换地址时  进度条的不关闭的问题
    })
    //全局后置守卫
router.afterEach(function() {
    NProgress.done()
})